# -*- coding: utf-8 -*-

"""
Created on Fri Jun  8 18:43:24 2018

@author: Administrator
"""
from multiprocessing import cpu_count
from multiprocessing.dummy import Pool as ThreadPool
print('parallel--parallel--parallel')

#%%
class MultiThread(object):
    
    #作用原理：如果有100个subject的BOLD image需要做smoothing，则可以使用MultiThread实现并行处理。
    #参数说明：class_key是做smooth的类，如Spm_smooth_SSM这个类的内存地址，通过locals()['Spm_smooth_SSM'],
    #参数说明：processing_parameter_list,core_percent
    #返回值说明：
    #举例：
    #父类：
    #子类：AgilePipe
    #调用：
    #被调用:
    #bug：
    #下面的字符串用于构造from import 语句，用于从processmethod这个module中导入处理类
    from_str = 'from '
    pckg =  ' agilepipe.process '  #这个参数需要根据情况，在子类中重新赋值
    import_str = ' import '
    def parallel(self,key,processing_parameter_list,core_percent):

        #下面的语句是根据key的取值，来从agilepipe.processmethod导入相应的处理类
        from_import_str = self.from_str + self.pckg + self.import_str + key
        print('key:',key)
        print('from_import_str:',from_import_str)
        exec(from_import_str)
        #print('locals()[key]------:',locals()[key])
        #class_key = globals()[key]  globals()用于返回全局变量
        class_key = locals()[key]
        #因为key包含的是函数同名字符串，故需要用上面的式子来转换成对应的函数名。并以此传入pool.map(),实现parallel processing。
        
        parallel_core = int(cpu_count() * abs(core_percent))
        if parallel_core == 0:
            #至少用1个核心来运算，防止百分比太小，导致parallel_core，使运算无法进行。
            parallel_core = 1
        if parallel_core >= cpu_count():
            #至多用cpu_count()-1个核心来运算，防止机器卡死。
            parallel_core = parallel_core - 1
        pool = ThreadPool(parallel_core)
        process_result_list = pool.map(class_key,processing_parameter_list)
        pool.close()
        pool.join()
        return process_result_list